/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [DaffodilNumber.java]
 * Creation Date        [10-Jul-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_01_console_app.daffodils;

/**
 * 水仙花数是指一个n(n>=3)位数字的数, 它等于每位数字的n次幂之和.<br>
 * 1000以内的水仙花数共有四个, 分别是153, 370, 371, 407, 本类即是考虑1000以内的水仙花数
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class DaffodilNumber {
	/**
	 * 直接调用printDaffodil()方法, 打印100-999之间的水仙花数
	 * 
	 * @param args
	 */
	public static void main(String[] args) throws NumberCrossBorderException {
		isDaffodilNumber2();
	}

	/**
	 * 判断一个数是否是水仙花数
	 * 
	 * @param number
	 *            要判断的水仙花数, 范围100-999
	 * @exception NubmerCrossBorderException
	 *                如果输入的数值不在范围之内, 抛出NubmerCrossBorderException异常
	 * @return 返回布尔值, true表示输入的是水仙花数, false表示输入的不是水仙花数
	 * 
	 *         主要算法是根据给定的三位数, 得出这三位数的个位, 十位, 百位, 然后判断这三位的立方和是否和该数相等
	 */
	public static boolean isDaffodilNumber1(int number)
			throws NumberCrossBorderException {
		if (number > 999 || number < 100) // 如果数值不在范围内, 抛出异常
			throw new NumberCrossBorderException("数值越界异常, 请输入100-999之间的数!");
		int c = number % 10; // 得出该数的个位数
		int b = number % 100 / 10; // 得出该数的十位数
		int a = number / 100; // 得出该数的百位数
		if (a * a * a + b * b * b + c * c * c == number)
			return true; // 如果符合水仙花数的定义, 返回true
		return false; // 否则, 返回false
	}

	/**
	 * 打印100-999之间的水仙花数 这个方法的实现有两种算法, 一种是从100-999做一重循环,
	 * 在循环内调用isDaffodilNumber1方法进行判断 另一种是百位, 十位和个位分别从1-9或0-9做三重循环, 在循环内直接进行判断
	 * 本方法使用的算法就是采用的第二种算法
	 */
	public static void isDaffodilNumber2() {
		for (int a = 1; a < 9; a++) { // 百位在1-9循环
			for (int b = 0; b < 9; b++) { // 十位在0-9循环
				for (int c = 0; c < 9; c++) { // 个位在0-9循环
					if (a * a * a + b * b * b + c * c * c == a * 100 + b * 10
							+ c) { // 如果满足水仙花的判断条件
						System.out.println(a * 100 + b * 10 + c); // 打印结果
					}
				}
			}
		}
	}
}
